Traditional command line programming language compilers are single threaded due to the batch-oriented nature of their work. In the context of user-interactive tools, however, many threads make requests of compiler services. For example, user interface views read and modify compiler data structures, file watching threads push file changes onto the compiler, and interactive editing triggers incremental compilation. In a programming language that has a global type system, threads performing type resolution need information from more than one file. This can lead to duplication of work and race conditions between the threads. What is needed is a way to make type resolution “thread safe” while at the same time preventing threads from becoming deadlocked.